#ifndef _BUOLA_GUI_COCOA_CCOCOATOOLKIT_H_
#define _BUOLA_GUI_COCOA_CCOCOATOOLKIT_H_

#include "auto.h"
#include <buola/gui/ctoolkit.h>

namespace buola { namespace gui { namespace cocoa {

///\addtogroup gui
///@{

///////////////////////////////////////////////////////////////////////////

/// cocoa toolkit

/// window environment implementation for mac
///
///////////////////////////////////////////////////////////////////////////

class CCocoaToolkit : public CToolkit
{
public:
////////////////////////////////
// constructor and destructor
//
    CCocoaToolkit();
    virtual ~CCocoaToolkit();

////////////////////////////////////////////////////////////////
////////////////////////// interface ///////////////////////////
////////////////////////////////////////////////////////////////

/////////////////
// synchronize
//
    virtual void Start();
    virtual void Synchronize();

///////////////////////////
// root and proxy window
//
    virtual void QueryPointer(CPhysicalWindow *pWindow,CPoint_d &pInWindow,CPoint_d &pInScreen);
    virtual CPhysicalWindow *GetNewPhysicalWindow(CWindow *pWindow);

//////////////////////////
// clipboard management
//
    virtual CClipboard *GetClipboard(int);

//////////////////
// display info
//
    virtual int GetDefaultDepth();

///////////////////
// pixmap access
//
    virtual img::CSurface *GetNewPixmap(const CSize_i&,int pDepth=0,unsigned char *pData=nullptr,int pStride=0);

//////////////
// keyboard
//
    ///from cocoa to buola
    static EKeyMod GetMods(NSUInteger pMods);
    ///from cocoa to buola
    static EKeyLock GetLocks(NSUInteger pMods);
    ///from cocoa to buola
    static EKeyCode GetKey(int pCode);
    
    virtual bool KeysEqual(const TKey &p1,const TKey &p2);

protected:
/////////////////////////////////////////////
//////////////// overridable ////////////////
/////////////////////////////////////////////

public:
////////////////////////////////////////
/////////////// internal ///////////////
////////////////////////////////////////

////////////
// cursor
//
    virtual long GetStockCursor(CPointer::EStock pIndex);
    virtual long GetCursor(unsigned char*,unsigned char*,int,int,int);

/////////////////////////////
// internal focus and grab
//
public:
    virtual void GrabKey(const TKey&,EKeyMod,bool,CWindow* =nullptr);
    virtual void UngrabKey(const TKey&,EKeyMod,CWindow* =nullptr);

//////////////////////
// openGL GC
//
    virtual img::CGC *GetOpenGLGC();
    
////////////////////////////////////
/////////////// data ///////////////
////////////////////////////////////

private:
};

///@}

/*namespace cocoa*/ } /*namespace gui*/ } /*namespace buola*/ }

#endif
